/**
 * 文件名：@RequestMethodHandlerAdapterAdvice.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.springmvc <br/>
 * 项目名：afw-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.springmvc;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;

import cn.efunbox.afw.core.advice.TargetAdvice;

/**
 * 类名：RequestMethodHandlerAdapterAdvice  <br />
 *
 * 功能：对处理器做增强处理
 *
 * @author xtwin <br />
 * 创建时间：2016年7月20日 下午6:15:40  <br />
 * @version 2016年7月20日
 */
public class RequestMethodHandlerAdapterAdvice implements TargetAdvice<RequestMappingHandlerAdapter> {
	
	// 返回值处理器
	private List<HandlerMethodReturnValueHandler> returnValueHandlers = Collections.emptyList();
	
	// 参数处理器
	private List<HandlerMethodArgumentResolver> argumentResolvers = Collections.emptyList();

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年8月3日 上午10:43:36<br/>
	 * 
	 * @param target <br/>
	 * @see cn.efunbox.afw.core.advice.TargetAdvice#advice(java.lang.Object)
	 */
	@Override
	public void advice(RequestMappingHandlerAdapter target) {
		// 返回值处理器增强处理
		adviceReturnValueHandler(target);
		
		// 参数处理器增强处理
		adviceArgumentResolver(target);
	}
	
	/**
	 * 功能：返回值处理器增强处理 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年7月24日 下午12:29:15 <br/>
	 */
	protected void adviceReturnValueHandler(RequestMappingHandlerAdapter handlerAdapter) {
		// 返回值处理器
		List<HandlerMethodReturnValueHandler> list = new ArrayList<>();
		
		// 先添加自定义的
		list.addAll(returnValueHandlers);
		// 添加原始的
		list.addAll(handlerAdapter.getReturnValueHandlers());
		
		// 更新值
		handlerAdapter.setReturnValueHandlers(list);
	}
	
	/**
	 * 功能：参数解析器增强 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月3日 上午10:41:37 <br/>
	 */
	protected void adviceArgumentResolver(RequestMappingHandlerAdapter handlerAdapter) {
		// 参数处理器
		List<HandlerMethodArgumentResolver> list = new ArrayList<>();
		
		// 先添加自定义的
		list.addAll(argumentResolvers);
		// 添加原始的
		list.addAll(handlerAdapter.getArgumentResolvers());
		
		// 更新值
		handlerAdapter.setArgumentResolvers(list);
	}

	/**
	 * @version 2016年7月21日-上午7:55:12
	 */
	public List<HandlerMethodReturnValueHandler> getReturnValueHandlers() {
		return returnValueHandlers;
	}

	/**
	 * @version 2016年7月21日-上午7:55:12
	 */
	public void setReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
		this.returnValueHandlers = returnValueHandlers;
	}

	/**
	 * @version 2016年7月24日-下午12:28:01
	 */
	public List<HandlerMethodArgumentResolver> getArgumentResolvers() {
		return argumentResolvers;
	}


	/**
	 * @version 2016年7月24日-下午12:28:01
	 */
	public void setArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
		this.argumentResolvers = argumentResolvers;
	}
}
